当前位置:  开发笔记 > 编程语言 > 正文

array [100] = {0}如何将整个数组设置为0?

如何解决《array[100]={0}如何将整个数组设置为0?》经验,为你挑选了4个好方法。

编译器如何填充值char array[100] = {0};?它背后的魔力是什么?

我想知道内部编译器如何初始化.



1> bk1e..:

这不是魔术.

C规范的第6.7.8.21节(C规范的在线草案)中描述了C中此代码的行为:对于没有指定值的元素,编译器将指针初始化为NULL,将算术类型初始化为零(并递归地将其应用于聚合).

C++中的代码行为在C++规范的8.5.1.7节(C++规范的在线草案)中描述:编译器聚合初始化没有指定值的元素.

另请注意,在C++(但不是C)中,您可以使用空的初始化列表,从而使编译器聚合初始化数组的所有元素:

char array[100] = {};

至于编译器在执行此操作时可能生成的代码类型,请查看以下问题:数组0初始化的奇怪组件



2> qrdl..:

实现取决于编译器开发人员.

如果您的问题是"这种声明会发生什么" - 编译器会将第一个数组元素设置为您提供的值(0),其他所有数组元素将设置为零,因为它是省略的数组元素的默认值.


Ryan,如果你没有设置第一个元素的值,整个数组是未初始化的,并且确实包含垃圾,但是如果你为它的至少一个元素设置一个值,整个数组就会被初始化,所以未指定的元素会被隐式初始化0.
@NatanYellin我在哪里说这是未定义的?请在评论和downvoting之前阅读完整的答案.

3> lakshmanaraj..:

如果您的编译器是GCC,您还可以使用以下语法:

int array[256] = {[0 ... 255] = 0};

请查看 http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits,并注意这是一个特定编译器的功能.


它没有用,它很有趣.警告值得注意.
像这样的东西让我回到SO并阅读超过前几个答案......

4> 小智..:

这取决于你进行初始化的地方.

如果数组是静态的,如

char array[100] = {0};

int main(void)
{
...
}

然后是编译器在程序的数据段中保留100 0字节.在这种情况下,您可以省略初始化器.

如果您的阵列是自动的,那么这是另一个故事.

int foo(void)
{
char array[100] = {0};
...
}

在这种情况下,每次调用函数foo时,你都会有一个隐藏的memset.

上面的代码相当于

int foo(void)
{ 
char array[100];

memset(array, 0, sizeof(array));
....
}

如果省略初始化程序,则数组将包含随机数据(堆栈数据).

如果您的本地数组声明为静态,如

int foo(void)
{ 
static char array[100] = {0};
...
}

那么它在技术上与第一个相同.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有